package org.example.api;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import org.example.core.pojo.ComfyuiRequestDto;
import org.example.core.pojo.DeleteQueueBody;
import org.example.core.pojo.QueueTaskCount;
import org.springframework.web.bind.annotation.ResponseBody;
import retrofit2.Call;
import retrofit2.http.*;

import java.util.HashMap;

public interface ComfyuiApi {
    /**
     * 获取历史任务
     * @param maxItems 获取的条数
     * @return
     */
    @GET("/history")
    Call<HashMap> getHistoryTasks(@Query("max_items") int maxItems);
    /**
     * 获取预览的图片信息
     * @param filename 文件名
     * @param type     文件类型，input/output
     * @param subfolder 字文件夹名
     * @return
     */
    @GET("/view")
    Call<ResponseBody> getView(@Query("filename") String filename,
                               @Query("type") String type, @Query("subfolder") String subfolder);
    /**
     * 获取系统信息
     * @return
     */
    @GET("/system_stats")
    Call<HashMap> getSystemStats();
    /**
     * 获取某个节点配置
     * @return
     */
    @GET("/object_info/{nodeName}")
    Call<HashMap> getNodeInfo(@Path("nodeName") String nodeName);
    /**
     * 取消当前的任务
     * @return
     */
    @POST("/interrupt")
    Call<Void> interruptTask();
    /**
     * 获取队列中的任务信息
     * @return
     */
    @GET("/queue")
    Call<HashMap> getQueueTasks();
    /**
     * 获取队列中的任务信息
     * @return

    在代码中声明了Comfyui的全部API，且声明时还使用到一些新注解，可解释为：
     @Query：用来声明http查询部分的参数，与@RequestParam类似
     @Body：用于声明请求体对象，与@RequestBody类似
     @Multipart：用于说明当前请求以表单形式发起，常常用于带有文件的接口
     */
    @POST("/queue")
    Call<HashMap> deleteQueueTasks(@Body DeleteQueueBody body);
    /**
     * 获取队列中任务数量
     * @return
     */
    @GET("/prompt")
    Call<QueueTaskCount> getQueueTaskCount();
    /**
     * 添加流程任务
     * @return
     */
    @POST("/prompt")
    Call<HashMap> addQueueTask(@Body ComfyuiRequestDto body);
    /**
     * 上传图片
     * @return
     */
    @Multipart
    @POST("/upload/image")
    Call<HashMap> uploadImage(@Part MultipartBody.Part image);
    /**
     * 上传图片
     * @return
     */
    @Multipart
    @POST("/upload/mask")
    Call<HashMap> uploadMask(@Part MultipartBody.Part image, @Part("type")
    RequestBody type, @Part("subfolder") RequestBody
                                     subfolder, @Part("original_ref") RequestBody originalRef);
    /**
     * 获取某个历史任务
     * @param promptId 任务ID
     * @return
     */
    @GET("/history/{promptId}")
    Call<HashMap> getHistoryTask(@Path("promptId") String promptId);
}
